function fn(a, b, c, d) {
  console.log("this", this);
  console.log("和为：", a+b+c+d);
  return a + b + c + d;
}

Function.prototype.myBind = function (ctx, ...args) {
  const func = this;
  const Fn =  function (...restArgs) {
    const allArgs = args.concat(restArgs);
    if(this instanceof Fn) { // 如果是用new 来调用方法的，this指向的是调用方法的实例对象
       return  new func(...allArgs);
    }
    return func.apply(ctx,allArgs);
  }
  // 如果绑定的是构造函数，那么需要继承构造函数的属性和方法
  Fn.prototype = Object.create(this.prototype);
  return Fn;
};

const newFn = fn.myBind(null, 1, 2);
// const newFn =  fn.bind({},1,2)
const fn1 = new newFn(3, 4);
console.log(fn1 instanceof fn);


/*  function add(a,b) {
    console.log('addThis',this)
    return a + b
 }

 const res =  new add(1,2)
 console.log('res',res) */
